#include<iostream>

using namespace std ;

const int maxn = 100010 ;

int n , m ; //n是点的数量 ， m 是操作的数量
int p[maxn] ;

//返回 x 的祖宗节点 + 路径压缩
int find(int x) {
    if(p[x] != x) {
        p[x] = find(p[x]) ;
    }
    return p[x] ;
}

int main() {

    scanf("%d%d" , &n , &m) ;

    /**
     * 这里面没有插入操作
     * 因为初始情况下一共 n 个结点
     * 每个结点都是自己的父节点 ， 即每个结点单独成为一个集合
     * 接下来的输入就是输入 1~n之间的数 ， 来把这些集合合并
     * 慢慢的就凑成了一个大集合
     */
    for (int i = 1; i <= n ; ++i) {
        p[i] = i ;  //初始情况下每个结点默认的指向自己
    }

    while(m--) {
        int a , b ;
        char op[2] ;
        scanf("%s%d%d" , op , &a , &b) ;
        if(op[0] == 'M') {
            //这个就是合并操作
            p[find(a)] = find(b) ;  //将a的祖宗结点的父节点指向 b 的父节点
        }else{
            if(find(a) == find(b)) {
                puts("Yes");
            } else {
                puts("No");
            }
        }
    }

    return 0 ;
}